package code11_util;

import java.util.Calendar;
import java.util.Date;

import org.junit.Test;

public class TestCalendar {

	@Test
	public void f1() {
		// 通过 静态方法获取 其对象
		// 返回包含当前系统时间的一个 日历类对象
		Calendar ca = Calendar.getInstance();// 单例、多例
		//System.out.println(ca);
		
		// 常用方法
		// 获取日历中的当前时间
		Date d1 = ca.getTime();
		System.out.println("日历中选中的时间:"+d1);
		
		// 设置日历中的当前时间
		Date d2 = new Date(1648002158398L);
		ca.setTime(d2);
		System.out.println("d2:"+d2);
		
		// get() 获取日期中指定字段的值(int)
		// 参数是 Calendar 的常量
		System.out.println("YEAR:"+ca.get(Calendar.YEAR));// 年
		// 月, java中保存的月份与实际显示出来的月份相差 1
		// java中的月份值范围 0~11
		int month = ca.get(Calendar.MONTH) + 1;
		System.out.println("MONTH:"+month);
		System.out.println("DATE:"+ca.get(Calendar.DATE));// 日
		System.out.println("DAY_OF_MONTH:"+ca.get(Calendar.DAY_OF_MONTH));// 一个月中的第几天
		// 一周中的第几天, 返回值是 1~7 ,1表示星期日(一周的第一天, 第二天是星期一, 最后一天是星期六)
		System.out.println("DAY_OF_WEEK:"+ca.get(Calendar.DAY_OF_WEEK));
		System.out.println("DAY_OF_YEAR:"+ca.get(Calendar.DAY_OF_YEAR));// 一年中的第几天
		System.out.println("HOUR:"+ca.get(Calendar.HOUR));// 时, 12小时制
		System.out.println("HOUR_OF_DAY:"+ca.get(Calendar.HOUR_OF_DAY));// 时, 24小时制
		System.out.println("MINUTE:"+ca.get(Calendar.MINUTE));// 分钟
		System.out.println("SECOND:"+ca.get(Calendar.SECOND));// 秒
		System.out.println("MILLISECOND:"+ca.get(Calendar.MILLISECOND));// 毫秒
	}
	@Test
	public void f2() {
		// 返回包含当前系统时间的一个 日历类对象
		Calendar ca = Calendar.getInstance();
		// set() 设置日历中的选中的 日期, 会遵循日历规范(会自动进位/退位)
		
		// 设置年月日, 月份范围 0~11
		int month = 2;// 2月
		ca.set(2000, month - 1, 20);
		System.out.println("time1:"+ca.getTime());
		
		// 设置年月日时(24)分秒, 可以使用对应的 月份常量
		ca.set(2004, Calendar.MAY, 5, 15, 30, 45);
		System.out.println("time2:"+ca.getTime());
		
		// 设置指定字段的值, 第一个参数一般使用 Calendar 的常量
		// 设置 日
		ca.set(Calendar.DAY_OF_MONTH, 32);// 日 超出限制
		System.out.println("time3:"+ca.getTime());
		// 设置 月
		ca.set(Calendar.MONTH, -1);// 月 超出限制
		System.out.println("time4:"+ca.getTime());
	}
	@Test
	public void f3() {
		Calendar ca = Calendar.getInstance();
		// 通过 add 时间的指定字段进行 加(减)的运算
		// year +2
		ca.add(Calendar.YEAR, 2);
		System.out.println("time1:"+ca.getTime());
		// day -30
		ca.add(Calendar.DAY_OF_MONTH, -30);
		System.out.println("time2:"+ca.getTime());
	}
	@Test
	public void f4() {
		Calendar ca = Calendar.getInstance();
		// 获取 日历中当前时间的毫秒值
		long timeInMillis = ca.getTimeInMillis();
		System.out.println("timeInMillis:"+timeInMillis);
		
		// 获取指定字段的 最大值、最小值
		// 获取当前日历中时间对应月份的最大的日的数值(该月的最大天数)
		int dayMax = ca.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println("dayMax:"+dayMax);
		int monthMin = ca.getActualMinimum(Calendar.MONTH);
		System.out.println("monthMin:"+monthMin);
		
		System.out.println("获取当前系统时间的毫秒值:" + System.currentTimeMillis());
	}
	@Test
	public void f5() {
		
		printQingMing();
	}
	/**
	 * 返回指定日期对应的星期的字符串表示, 例如: 星期一，星期日
	 * @param d 日期
	 * @return 星期
	 */
	public static String getDayOfWeek(Date d) {
		Calendar ca = Calendar.getInstance();
		// 设置指定日期
		ca.setTime(d);
		// 获取星期(1~7) - 1
		int weekIndex = ca.get(Calendar.DAY_OF_WEEK) - 1;
		String[] arr = {"日","一","二","三","四","五","六"};
		return "星期" + arr[weekIndex];
	}
	/**
	 * 判断某一年是否是闰年
	 * @param year 
	 * @return true 表示是闰年
	 */
	public static boolean isRunNain(int year) {
		Calendar ca = Calendar.getInstance();
		ca.set(year, Calendar.FEBRUARY, 1);// 设置日期为当年的2月1日
		// 取2月的总天数
		return ca.getActualMaximum(Calendar.DAY_OF_MONTH) == 29;
	}
	/**
	 * 输出 2000~2010 年之间所有清明节(4月5日)当天是星期几
	 */
	public static void printQingMing() {
		String[] arr = {"日","一","二","三","四","五","六"};
		Calendar ca = Calendar.getInstance();
		for (int year = 2000; year <= 2010; year++) {
			// 循环年, 找到当年的清明节日期
			ca.set(year, 3, 5);// month 0~11
			
			int weekIndex = ca.get(Calendar.DAY_OF_WEEK) - 1;
			System.out.println("星期" + arr[weekIndex]);
		}
	}
}
